﻿using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using YookingBizWQW.Class.Public;
using YookingDBNormal.Class;
using YookingFileIO.Class;
using YookingKitBox.Class.Public;
using YookingSvrDBCall.Class.DBLogic;
using YookingSvrDBCall.Class.DBPub;

namespace YookingBizWQW.Class.ProberDev
{
    public class clsMacCollect
    {
        //注释：王庆文 2020年08月10日===============================================================================
        //将探针设备上传过来的数据，转换成json数组之后提交给后台服务器去分析和处理。
        //先把不是手机设备的MAC分拣处理扔掉，然后再把剩下的手机MAC批量写入到数据库中，并判断insert或者update
        public string SaveProberMacDataToDB(string strB64RequestData)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strSrcJsonArray = "[{null}]"; //将要向数据库中写入的真实数据内容

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 1)
            {
                strSrcJsonArray = strArray[0];
            }

            #endregion

            if (!string.IsNullOrEmpty(strSrcJsonArray) && strSrcJsonArray != "[]"
                 && strSrcJsonArray != "[{}]" && strSrcJsonArray != "[{null}]")
            {
                Object objProber = JsonConvert.DeserializeObject(strSrcJsonArray); //json数组文本转成对象
                JArray jobjProber = objProber as JArray; //把上面的objProber转换为JArray对象

                #region 组合出采集到的MAC特征码查询条件

                string strBrandMacSet = "'AAA'"; //设备MAC集合
                for (int i = 0; i < jobjProber.Count; i++)
                {
                    string strDeviceMac = jobjProber[i]["MobileMac"].ToString(); //物理设备MAC地址
                    string strBrandMac = strDeviceMac.Substring(0, 8); //生成厂家MAC特征值

                    strBrandMacSet += ",'" + strBrandMac.ToUpper() + "'"; //全部品牌特征码组合在一起
                }

                #endregion

                #region 从品牌库中查询出移动设备专属的MAC特征码集合

                string strMobileBrdMacSet = "AA:BB:MN"; //移动设备MAC特征码集合

                //查询这些MAC地址中哪些属于移动设备的MAC，电脑、冰箱、路由器等设备的MAC不算在内
                string strBrandSQL = " select MACADDR from PROBER_PHONEMANUFACTURE ";
                strBrandSQL += " where " + clsSQLSyntax.IsNullSQL("Data", "SYS_CANCELDATETIME");
                strBrandSQL += " and upper(DeviceModel) = 'MOBILE DEVICE' ";
                strBrandSQL += " and upper(MacAddr) in (" + strBrandMacSet + ") ";

                //clsRWFile myLog1 = new clsRWFile(); //将待执行的SQL语句记录下来
                //myLog1.WriteInfoToTxtFile("SysLog", "aa_Brand.txt", strBrandSQL);

                clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
                DataSet dsBrd = myDB.YookingExecuteDataSet("Data", strBrandSQL);
                if (dsBrd != null && dsBrd.Tables.Count > 0 && dsBrd.Tables[0].Rows.Count > 0)
                {
                    DataTable dtBrd = dsBrd.Tables[0];
                    foreach (DataRow drRow in dtBrd.Rows)
                    {
                        //从数据库中查询出来的移动设备MAC特征码
                        strMobileBrdMacSet += "," + drRow["MACADDR"].ToString();
                    }
                }

                #endregion

                //找了移动设备专属的MAC特征码，则进行写库处理
                if (strMobileBrdMacSet != "AA:BB:MN")
                {
                    //仅包含移动设备MAC的JSON数组信息
                    JArray JNewJsonArray = new JArray();

                    #region 从原始json数组对象中过滤出纯手机移动设备的MAC信息

                    for (int i = 0; i < jobjProber.Count; i++)
                    {
                        string strDeviceMac = jobjProber[i]["MobileMac"].ToString(); //物理设备MAC地址
                        string strBrandMac = strDeviceMac.Substring(0, 8); //生成厂家MAC特征值

                        //判断当前MAC是否属于手机移动设备
                        if (strMobileBrdMacSet.Contains("," + strBrandMac))
                        {
                            //从原始的strSrcJsonArray数据集中过滤出
                            //当前设备strDeviceMac的那一行对应的数据（返回的是json数组格式）
                            foreach (JObject objItem in jobjProber)  //在整个JSON数组对象中查找
                            {
                                if (objItem["MobileMac"].ToString() == strDeviceMac)
                                {
                                    JNewJsonArray.Add(objItem); //如果是手机设备信息，则放入新JSON对象中
                                }
                            }
                        }
                    }

                    #endregion

                    #region 将新生成的纯手机设备MAC数据写入到数据库中

                    //纯移动设备MAC地址的JSON对象如果不为空，并且有新数据
                    if (JNewJsonArray != null && JNewJsonArray.Count > 0)
                    {
                        string strNewJsonArray = JNewJsonArray.ToString();

                        //clsRWFile myLog2 = new clsRWFile(); //将待执行的SQL语句记录下来
                        //myLog2.WriteInfoToTxtFile("SysLog", "aa_NewJson.txt", strNewJsonArray);

                        //将Json数组转成DataSet
                        DataSet dsData = clsJConvert.JArryToDataSet(strNewJsonArray);

                        //先判断数据是否存在，根据判断结果自动执行insert或者update
                        //需要判断是否重值的字段名，可以支持多个字段
                        clsWriteDB myWrite = new clsWriteDB(); //实例化数据库操作类 
                        string strKeyColSet = "SENDIPADDRESS,DATARECEIVETIME,DEVICESNID,MOBILEMAC,ROUTERMAC,FRAMEMAINTYPE,FRAMESUBTYPE,CHANNELVALUE,RSSIVALUE,MOBILETODEVICEDISTANCE,ISROUTERSEND,TEMPFIELD,OTHERMEMO";
                        strRtData = myWrite.WriteDBNormal_UseSYSCol("Data", "PROBER_MACCOLLECTIONPOOL", strKeyColSet, "02120119901", dsData);
                    }

                    #endregion
                }
            }

            return strRtData; //数据库操作的最终结果
        }




    }
}
